home *** CD-ROM | disk | FTP | other *** search
/ MacHack 1998 / MacHack 1998.toast / The Hacks! / COSEmulator / COSEmulator- SRC / src / Blitters.cpp < prev    next >
Encoding:
Text File  |  1998-06-21  |  19.7 KB  |  722 lines  |  [TEXT/CWIE]

  1. //===================================================================
  2. //=======================  Headers        =============================
  3.  
  4. #include "Blitters.h"
  5. #include "GameUtilities.h"
  6.  
  7. //===================================================================
  8. //=======================  Globals        =============================
  9.  
  10.  
  11. //===================================================================
  12. //=======================  #define        =============================
  13.  
  14.  
  15. //===================================================================
  16. //=======================  Function Prototypes    =====================
  17.  
  18.  
  19. /*----------------------------------------------------------------------------\
  20.  
  21.     PaintRect
  22.  
  23. - makes everything with in that rect that color
  24.  
  25. \----------------------------------------------------------------------------*/
  26.  
  27. void    PaintRect( OffScreenBuff *buff, const rect *r , ushort color )
  28. {
  29.     ulong    rowSize;
  30.     ushort    *pixPtr , *rowStart;
  31.     short    x;
  32.     short    y;
  33.     
  34.     rowSize = buff->GetRowSize();
  35.              
  36.     (char *)rowStart = (char *)buff->GetSrcPtr() + r->top * rowSize + r->left * sizeof( short );
  37.  
  38.     for( y = r->top; y < r->bottom; y++ )
  39.     {
  40.         pixPtr = rowStart;
  41.         
  42.         for( x = r->left; x < r->right; x++ )
  43.         {
  44.             *pixPtr = color;
  45.             
  46.             pixPtr++;
  47.         }
  48.         
  49.         (char *)rowStart += rowSize;
  50.     }
  51. }
  52.  
  53.  
  54. /*----------------------------------------------------------------------------\
  55.  
  56.     DrawPicture
  57.  
  58. - it asumes the rectangles are the same size
  59.  
  60. \----------------------------------------------------------------------------*/
  61.  
  62. int    DrawGeneric(     OffScreenBuff *srcBuff, const rect *src ,
  63.                     OffScreenBuff *destBuff , const rect *dest , const rect *destClip ,
  64.                     ushort    options , uchar more , ushort color )
  65. {
  66.     if( options == 0 )
  67.         DrawPicture( srcBuff , src , destBuff , dest );
  68.     else if( options & kDrawCrop1 )
  69.     {
  70.         DrawGenericCliped1( srcBuff , src , destBuff , dest , destClip, options , more , color );
  71.     }
  72.     else if( options & kDrawTransparent )
  73.     {
  74.         if( options & kDrawCrop2 )
  75.         {
  76.             DrawClipedPicture2( srcBuff , src , destBuff , dest , destClip );
  77.         }
  78.         else if( options & kDrawTranslucent )
  79.         {
  80.             DrawClearTranslu( srcBuff , src , destBuff , dest , more );
  81.         }
  82.         else
  83.         {
  84.             // for now assume it wants a plain copy
  85.             DrawClearPic( srcBuff , src , destBuff , dest );
  86.         }
  87.     }
  88.     else if( options & kDrawInverse )
  89.     {
  90.         DrawPictureInverse( srcBuff , src , destBuff , dest );
  91.     }
  92.     else if( options & kDrawTint )
  93.     {
  94.         DrawPictureTint( srcBuff , src , destBuff , dest , more , color );
  95.     }
  96.     else
  97.     {
  98.         return -1;    // not suppoorted
  99.     }
  100.     
  101.     return 0;
  102.     
  103.                 
  104. }
  105. /*----------------------------------------------------------------------------\
  106.  
  107.     DrawPicture
  108.  
  109. - it asumes the rectangles are the same size
  110.  
  111. \----------------------------------------------------------------------------*/
  112.  
  113. void    DrawPicture(     OffScreenBuff *srcBuff, const rect *src ,
  114.                                         OffScreenBuff *destBuff , const rect *dest )
  115. {    
  116.     ulong    srcRowSize;
  117.     ulong    destRowSize;
  118.     ushort    *srcPtr , *srcRowStart;
  119.     ushort    *destPtr , *destRowStart;
  120.     short    y;
  121.     ulong    amountLeft;
  122.     ulong    amountInRow;
  123.     
  124.     srcRowSize = srcBuff->GetRowSize();
  125.     destRowSize = destBuff->GetRowSize();
  126.              
  127.     (char *)srcRowStart = (char *)srcBuff->GetSrcPtr() + src->top * srcRowSize + src->left * sizeof( short );
  128.     (char *)destRowStart = (char *)destBuff->GetSrcPtr() + dest->top * destRowSize + dest->left * sizeof( short );
  129.  
  130.     amountInRow = (dest->right - dest->left) * sizeof( short );
  131.     
  132.     for( y = dest->top; y < dest->bottom; y++ )
  133.     {
  134.         srcPtr = srcRowStart;
  135.         destPtr = destRowStart;
  136.  
  137.         amountLeft = amountInRow;
  138.         
  139. //        while( amountLeft > sizeof( double ) )
  140. //        {
  141. //            *((double *)destPtr)++ =  *((double *)srcPtr)++;
  142. //            amountLeft -= sizeof(double);
  143. //        }
  144.         
  145.         while( amountLeft > sizeof( long ) )
  146.         {
  147.             *((long *)destPtr)++ =  *((long *)srcPtr)++;
  148.             amountLeft -= sizeof(long);
  149.         }
  150.  
  151.         while( amountLeft >= sizeof( short ) )
  152.         {
  153.             *((short *)destPtr)++ =  *((short *)srcPtr)++;
  154.             amountLeft -= sizeof(short);
  155.         }
  156.                         
  157.             
  158.     /*    for( x = dest->left; x < dest->right; x++ )
  159.         {
  160.             *destPtr = *srcPtr;
  161.             
  162.             destPtr++;
  163.             srcPtr++;
  164.         } */
  165.         
  166.         (char *)srcRowStart += srcRowSize;
  167.         (char *)destRowStart += destRowSize;
  168.     }
  169.  
  170. //        CopyBits( (BitMap *) (*(srcBuff->GetOffScreen()->PixMap)), (BitMap *) (*(destBuff->GetOffScreen()->PixMap)),
  171. //        & rToR( src ), & rToR( dest ), srcCopy , (RgnHandle)nil );
  172. }
  173.  
  174. /*----------------------------------------------------------------------------\
  175.  
  176.     DrawPictureInverse
  177.  
  178. - draws the inverse of the color in the src onto the dest
  179.  
  180. \----------------------------------------------------------------------------*/
  181.  
  182. void    DrawPictureInverse(     OffScreenBuff *srcBuff, const rect *src ,
  183.                                         OffScreenBuff *destBuff , const rect *dest )
  184. {
  185.     ulong    srcRowSize;
  186.     ulong    destRowSize;
  187.     ushort    *srcPtr , *srcRowStart;
  188.     ushort    *destPtr , *destRowStart;
  189.     short    x;
  190.     short    y;
  191.     
  192.     srcRowSize = srcBuff->GetRowSize();
  193.     destRowSize = destBuff->GetRowSize();
  194.              
  195.     (char *)srcRowStart = (char *)srcBuff->GetSrcPtr() + src->top * srcRowSize + src->left * sizeof( short );
  196.     (char *)destRowStart = (char *)destBuff->GetSrcPtr() + dest->top * destRowSize + dest->left * sizeof( short );
  197.  
  198.     for( y = dest->top; y < dest->bottom; y++ )
  199.     {
  200.         srcPtr = srcRowStart;
  201.         destPtr = destRowStart;
  202.         
  203.         for( x = dest->left; x < dest->right; x++ )
  204.         {
  205.             *destPtr = ~*srcPtr;
  206.             
  207.             destPtr++;
  208.             srcPtr++;
  209.         }
  210.         
  211.         (char *)srcRowStart += srcRowSize;
  212.         (char *)destRowStart += destRowSize;
  213.     }
  214.     
  215. //        CopyBits( (BitMap *) (*(srcBuff->GetOffScreen()->PixMap)), (BitMap *) (*(destBuff->GetOffScreen()->PixMap)),
  216. //        & rToR( src ), & rToR( dest ), srcCopy , (RgnHandle)nil );
  217. }
  218.  
  219. /*----------------------------------------------------------------------------\
  220.  
  221.     DrawPictureTint
  222.  
  223. - tinks the src the color specified to the mag specified (0-31)
  224. \----------------------------------------------------------------------------*/
  225.  
  226. void    DrawPictureTint(     OffScreenBuff *srcBuff, const rect *src ,
  227.                             OffScreenBuff *destBuff , const rect *dest ,
  228.                             uchar mag , ushort color )
  229. {    
  230.     ulong    srcRowSize;
  231.     ulong    destRowSize;
  232.     ushort    *srcPtr , *srcRowStart;
  233.     ushort    *destPtr , *destRowStart;
  234.     short    x;
  235.     short    y;
  236.     
  237.     ulong    result,a,b;
  238.     uchar    bMag;
  239.     
  240.     srcRowSize = srcBuff->GetRowSize();
  241.     destRowSize = destBuff->GetRowSize();
  242.              
  243.     (char *)srcRowStart = (char *)srcBuff->GetSrcPtr() + src->top * srcRowSize + src->left * sizeof( short );
  244.     (char *)destRowStart = (char *)destBuff->GetSrcPtr() + dest->top * destRowSize + dest->left * sizeof( short );
  245.     
  246.     mag &= 0x1f;    // make sure it is 0 to 31
  247.     bMag = 32 - mag;
  248.     
  249.     for( y = dest->top; y < dest->bottom; y++ )
  250.     {
  251.         srcPtr = srcRowStart;
  252.         destPtr = destRowStart;
  253.         
  254.         for( x = dest->left; x < dest->right; x++ )
  255.         {
  256.             //*destPtr = *srcPtr & 0x6318;
  257.             a = (color & 0x03e0 ) << 15;
  258.             a |= (color & 0x7c1f );
  259.             
  260.             b = (*srcPtr & 0x03e0 ) << 15;
  261.             b |= (*srcPtr & 0x7c1f );
  262.             
  263.             result = ((a * mag) + (b * (bMag))) >> 5;            
  264.             result = (result & 0x00007c1f ) | ((result & 0x01f00000 ) >> 15);
  265.             
  266.             *destPtr = result;//*destPtr = *srcPtr;
  267.             
  268.             destPtr++;
  269.             srcPtr++;
  270.         }
  271.         
  272.         (char *)srcRowStart += srcRowSize;
  273.         (char *)destRowStart += destRowSize;
  274.     }
  275.  
  276.     //    CopyBits( (BitMap *) (*(srcBuff->GetOffScreen()->PixMap)), (BitMap *) (*(destBuff->GetOffScreen()->PixMap)),
  277.     //    & rToR( src ), & rToR( dest ), srcCopy , (RgnHandle)nil );
  278. }
  279. /*----------------------------------------------------------------------------\
  280.  
  281.     DrawTranslu
  282.  
  283. - normal draw, except it is transulcent
  284.  
  285. \----------------------------------------------------------------------------*/
  286.  
  287. void    DrawTranslu( OffScreenBuff *srcBuff, const rect *src , 
  288.                      OffScreenBuff *destBuff , const rect *dest , uchar    mag)
  289. {
  290.  
  291.     ulong    srcRowSize;
  292.     ulong    destRowSize;
  293.     short    *srcPtr , *srcRowStart;
  294.     short    *destPtr , *destRowStart;
  295.     short    x;
  296.     short    y;
  297.  
  298.     ulong    result,a,b;
  299.     uchar    bMag;
  300.     
  301.     srcRowSize = srcBuff->GetRowSize();
  302.     destRowSize = destBuff->GetRowSize();
  303.  
  304.      
  305.     (char *)srcRowStart = (char *)srcBuff->GetSrcPtr() + src->top * srcRowSize + src->left * sizeof( ushort );
  306.     (char *)destRowStart = (char *)destBuff->GetSrcPtr() + dest->top * destRowSize + dest->left * sizeof( ushort );
  307.     
  308.     mag &= 0x1f;    // make sure it is 0 to 31
  309.     bMag = 32 - mag;
  310.     
  311.     for( y = dest->top; y < dest->bottom; y++ )
  312.     {
  313.         srcPtr = srcRowStart;
  314.         destPtr = destRowStart;
  315.         
  316.         for( x = dest->left; x < dest->right; x++ )
  317.         {
  318.             //*destPtr = *srcPtr & 0x6318;
  319.             a = (*srcPtr & 0x03e0 ) << 15;
  320.             a |= (*srcPtr & 0x7c1f );
  321.             
  322.             b = (*destPtr & 0x03e0 ) << 15;
  323.             b |= (*destPtr & 0x7c1f );
  324.             
  325.             result = ((a * mag) + (b * (bMag))) >> 5;            
  326.             result = (result & 0x00007c1f ) | ((result & 0x01f00000 ) >> 15);
  327.             
  328.             *destPtr = result;//*destPtr = *srcPtr;
  329.     
  330.             destPtr++;
  331.             srcPtr++;
  332.         }
  333.         
  334.         (char *)srcRowStart += srcRowSize;
  335.         (char *)destRowStart += destRowSize;
  336.     }
  337.  
  338. //        CopyBits( (BitMap *) (*(srcBuff->GetOffScreen()->PixMap)), (BitMap *) (*(destBuff->GetOffScreen()->PixMap)),
  339. //        & rToR( src ), & rToR( dest ), srcCopy , (RgnHandle)nil );
  340. }
  341.  
  342. /*
  343.      whyte: your average 16bit pixel looks like this ARRRRRGGGGGBBBBB...but to do this you need to use
  344.       32bit values...so your average 16 bit pixel would look like this (dropping the alpha) 
  345.       00000000000000000RRRRRGGGGGBBBBB
  346.  
  347.      whyte: first thing you do is convert it to the form: 0000000GGGGG00000RRRRR00000BBBBB...can do 
  348.      that fast with a couple shifts/ands/ors
  349.  
  350.      whyte: you do that for both pixels, lets call them pixelA and pixelB
  351.      
  352.      whyte: then, resultPixel = ((pixelA * intensity) + (pixelB * (32 - intensity))) >> 5
  353.      
  354.      whyte: then, you convert resultPixel from XXXXXXXGGGGGXXXXXRRRRRXXXXXBBBBB back to 
  355.      0RRRRRGGGGGBBBBB and you have a neat and really fast way to combine any two pixels 
  356.      with 32 levels of translucency
  357.      
  358.      whyte: you can actually that whole operation in about 8 instructions, if your smart and watch how you code it very carefully
  359.      whyte: er, code taht whole...
  360.      
  361.      whyte: btw, intensity must be 0 >= x <= 32
  362.      
  363.      
  364.      ulong    pix32 = (pix16 & 0x781f ) << 15;
  365.      
  366.      pix32 ^= (pix16 & 0x03e0 );
  367.  
  368.  
  369.  
  370. */
  371.  
  372. /*----------------------------------------------------------------------------\
  373.  
  374.     DrawClearPic
  375.  
  376. \----------------------------------------------------------------------------*/
  377.  
  378. void    DrawClearPic( OffScreenBuff *srcBuff, const rect *src , 
  379.                                         OffScreenBuff *destBuff , const rect *dest )
  380. {
  381.     ulong    srcRowSize;
  382.     ulong    destRowSize;
  383.     short    *srcPtr , *srcRowStart;
  384.     short    *destPtr , *destRowStart;
  385.     short    x;
  386.     short    y;
  387.  
  388.     
  389.     srcRowSize = srcBuff->GetRowSize();
  390.     destRowSize = destBuff->GetRowSize();
  391.              
  392.     (char *)srcRowStart = (char *)srcBuff->GetSrcPtr() + src->top * srcRowSize + src->left * sizeof( ushort );
  393.     (char *)destRowStart = (char *)destBuff->GetSrcPtr() + dest->top * destRowSize + dest->left * sizeof( ushort );
  394.     
  395.     for( y = dest->top; y < dest->bottom; y++ )
  396.     {
  397.         srcPtr = srcRowStart;
  398.         destPtr = destRowStart;
  399.         
  400.         for( x = dest->left; x < dest->right; x++ )
  401.         {
  402.             if( *srcPtr != 0x7fff)
  403.             {        
  404.                 *destPtr = *srcPtr;
  405.             }
  406.     
  407.             destPtr++;
  408.             srcPtr++;
  409.         }
  410.         
  411.         (char *)srcRowStart += srcRowSize;
  412.         (char *)destRowStart += destRowSize;
  413.     }
  414.  
  415. //        CopyBits( (BitMap *) (*(srcBuff->GetOffScreen()->PixMap)), (BitMap *) (*(destBuff->GetOffScreen()->PixMap)),
  416. //        & rToR( src ), & rToR( dest ), srcCopy , (RgnHandle)nil );    
  417. }
  418.  
  419. /*----------------------------------------------------------------------------\
  420.  
  421.     DrawClearPicColor
  422.  
  423. - it doesnt draw the kClearColor
  424. - it tints it the color that is specified
  425.  
  426. *** THIS ISNT DONE YET *****
  427. \----------------------------------------------------------------------------*/
  428.  
  429. void    DrawClearPicColor( OffScreenBuff *srcBuff, const rect *src , 
  430.                                         OffScreenBuff *destBuff , const rect *dest ,
  431.                                         ushort    color )
  432. {
  433.     ulong    srcRowSize;
  434.     ulong    destRowSize;
  435.     short    *srcPtr , *srcRowStart;
  436.     short    *destPtr , *destRowStart;
  437.     short    x;
  438.     short    y;
  439.  
  440.     
  441.     srcRowSize = srcBuff->GetRowSize();
  442.     destRowSize = destBuff->GetRowSize();
  443.              
  444.     (char *)srcRowStart = (char *)srcBuff->GetSrcPtr() + src->top * srcRowSize + src->left * sizeof( ushort );
  445.     (char *)destRowStart = (char *)destBuff->GetSrcPtr() + dest->top * destRowSize + dest->left * sizeof( ushort );
  446.     
  447.     for( y = dest->top; y < dest->bottom; y++ )
  448.     {
  449.         srcPtr = srcRowStart;
  450.         destPtr = destRowStart;
  451.         
  452.         for( x = dest->left; x < dest->right; x++ )
  453.         {
  454.             if( *srcPtr != kBackGroundColor)
  455.             {        
  456.                 *destPtr = color;
  457.             }
  458.     
  459.             destPtr++;
  460.             srcPtr++;
  461.         }
  462.         
  463.         (char *)srcRowStart += srcRowSize;
  464.         (char *)destRowStart += destRowSize;
  465.     }
  466.  
  467. //        CopyBits( (BitMap *) (*(srcBuff->GetOffScreen()->PixMap)), (BitMap *) (*(destBuff->GetOffScreen()->PixMap)),
  468. //        & rToR( src ), & rToR( dest ), srcCopy , (RgnHandle)nil );    
  469. }
  470.  
  471. /*----------------------------------------------------------------------------\
  472.  
  473.     DrawClearPicTint
  474.  
  475. \----------------------------------------------------------------------------*/
  476.  
  477. void    DrawClearPicTint( OffScreenBuff *srcBuff, const rect *src , 
  478.                                         OffScreenBuff *destBuff , const rect *dest ,
  479.                                         uchar mag , ushort color )
  480. {
  481.     ulong    srcRowSize;
  482.     ulong    destRowSize;
  483.     short    *srcPtr , *srcRowStart;
  484.     short    *destPtr , *destRowStart;
  485.     short    x;
  486.     short    y;
  487.  
  488.     ulong    result,a,b;
  489.     uchar    bMag;
  490.         
  491.     srcRowSize = srcBuff->GetRowSize();
  492.     destRowSize = destBuff->GetRowSize();
  493.              
  494.     (char *)srcRowStart = (char *)srcBuff->GetSrcPtr() + src->top * srcRowSize + src->left * sizeof( ushort );
  495.     (char *)destRowStart = (char *)destBuff->GetSrcPtr() + dest->top * destRowSize + dest->left * sizeof( ushort );
  496.     
  497.     mag &= 0x1f;    // make sure it is 0 to 31
  498.     bMag = 32 - mag;
  499.     
  500.     for( y = dest->top; y < dest->bottom; y++ )
  501.     {
  502.         srcPtr = srcRowStart;
  503.         destPtr = destRowStart;
  504.         
  505.         for( x = dest->left; x < dest->right; x++ )
  506.         {
  507.             if( *srcPtr != kBackGroundColor)
  508.             {        
  509.                 a = (color & 0x03e0 ) << 15;
  510.                 a |= (color & 0x7c1f );
  511.                 
  512.                 b = (*srcPtr & 0x03e0 ) << 15;
  513.                 b |= (*srcPtr & 0x7c1f );
  514.                 
  515.                 result = ((a * mag) + (b * (bMag))) >> 5;            
  516.                 result = (result & 0x00007c1f ) | ((result & 0x01f00000 ) >> 15);
  517.                 
  518.                 *destPtr = result;//*destPtr = *srcPtr;
  519.             }
  520.     
  521.             destPtr++;
  522.             srcPtr++;
  523.         }
  524.         
  525.         (char *)srcRowStart += srcRowSize;
  526.         (char *)destRowStart += destRowSize;
  527.     }
  528.  
  529. //        CopyBits( (BitMap *) (*(srcBuff->GetOffScreen()->PixMap)), (BitMap *) (*(destBuff->GetOffScreen()->PixMap)),
  530. //        & rToR( src ), & rToR( dest ), srcCopy , (RgnHandle)nil );    
  531. }
  532.  
  533. /*----------------------------------------------------------------------------\
  534.  
  535.     DrawClearTranslu
  536.  
  537. - draw on with skiping white color, translucent, mag = 0 to 31
  538. \----------------------------------------------------------------------------*/
  539.  
  540. void    DrawClearTranslu( OffScreenBuff *srcBuff, const rect *src , 
  541.                                         OffScreenBuff *destBuff , const rect *dest , uchar    mag)
  542. {
  543.     ulong    srcRowSize;
  544.     ulong    destRowSize;
  545.     short    *srcPtr , *srcRowStart;
  546.     short    *destPtr , *destRowStart;
  547.     short    x;
  548.     short    y;
  549.  
  550.     ulong    result,a,b;
  551.     uchar    bMag;
  552.     
  553.     srcRowSize = srcBuff->GetRowSize();
  554.     destRowSize = destBuff->GetRowSize();
  555.  
  556.      
  557.     (char *)srcRowStart = (char *)srcBuff->GetSrcPtr() + src->top * srcRowSize + src->left * sizeof( ushort );
  558.     (char *)destRowStart = (char *)destBuff->GetSrcPtr() + dest->top * destRowSize + dest->left * sizeof( ushort );
  559.     
  560.     mag &= 0x1f;    // make sure it is 0 to 31
  561.     bMag = 32 - mag;
  562.     
  563.     for( y = dest->top; y < dest->bottom; y++ )
  564.     {
  565.         srcPtr = srcRowStart;
  566.         destPtr = destRowStart;
  567.         
  568.         for( x = dest->left; x < dest->right; x++ )
  569.         {
  570.             if( *srcPtr != kBackGroundColor)
  571.             {
  572.                 a = (*srcPtr & 0x03e0 ) << 15;
  573.                 a |= (*srcPtr & 0x7c1f );
  574.                 
  575.                 b = (*destPtr & 0x03e0 ) << 15;
  576.                 b |= (*destPtr & 0x7c1f );
  577.                 
  578.                 result = ((a * mag) + (b * (bMag))) >> 5;            
  579.                 result = (result & 0x00007c1f ) | ((result & 0x01f00000 ) >> 15);
  580.                 
  581.                 *destPtr = result;
  582.             }
  583.     
  584.             destPtr++;
  585.             srcPtr++;
  586.         }
  587.         
  588.         (char *)srcRowStart += srcRowSize;
  589.         (char *)destRowStart += destRowSize;
  590.     }
  591.  
  592. //        CopyBits( (BitMap *) (*(srcBuff->GetOffScreen()->PixMap)), (BitMap *) (*(destBuff->GetOffScreen()->PixMap)),
  593. //        & rToR( src ), & rToR( dest ), srcCopy , (RgnHandle)nil );
  594.  
  595. }
  596.  
  597.  
  598. /*----------------------------------------------------------------------------\
  599.  
  600.     DrawClipedPictureClear
  601.  
  602. - Clip 1, except it skips the kClearColor and does translucent
  603.  
  604. \----------------------------------------------------------------------------*/
  605.  
  606. void    DrawGenericCliped1( OffScreenBuff *srcBuff, const rect *src ,
  607.                             OffScreenBuff *destBuff , const rect *dest , const rect *destClip ,
  608.                             ushort    options , uchar more , ushort color )
  609. {
  610.  
  611.     rect    newSrc, newDest;
  612.  
  613.     // need to check if they intersect *Kinda HAck*
  614.     if( !MySectRect( dest , destClip ) )
  615.         return;
  616.     
  617.     newDest.left = ( dest->left > destClip->left ) ? dest->left : destClip->left;                
  618.     newDest.right = ( dest->right < destClip->right ) ? dest->right : destClip->right;
  619.     newDest.top = ( dest->top > destClip->top ) ? dest->top : destClip->top;
  620.     newDest.bottom = ( dest->bottom < destClip->bottom ) ? dest->bottom : destClip->bottom;
  621.     
  622.     newSrc = *src;
  623.  
  624.         
  625.     newSrc.left +=  ( dest->left < destClip->left ) ? destClip->left - dest->left : 0; 
  626.     newSrc.right -= ( dest->right  > destClip->right ) ? dest->right - destClip->right : 0;
  627.     newSrc.top += ( dest->top < destClip->top ) ? destClip->top - dest->top : 0;
  628.     newSrc.bottom -= ( dest->bottom > destClip->bottom ) ? dest->bottom - destClip->bottom : 0;
  629.  
  630.  
  631.     if( options & kDrawTransparent )
  632.     {
  633.         if( options & kDrawTranslucent )
  634.             DrawClearTranslu( srcBuff , &newSrc , destBuff , &newDest , more );
  635.         else if( options & kDrawColorize )
  636.             DrawClearPicColor( srcBuff , &newSrc , destBuff , &newDest , color );
  637.         else if( options & kDrawTint )
  638.             DrawClearPicTint( srcBuff , &newSrc , destBuff , &newDest , more , color );
  639.         else
  640.             DrawClearPic( srcBuff , &newSrc , destBuff , &newDest );
  641.     }
  642.     else if( options & kDrawTranslucent )
  643.     {
  644.         DrawTranslu( srcBuff , &newSrc , destBuff , &newDest , more );
  645.     }
  646.     else if( options & kDrawInverse )
  647.     {
  648.         DrawPictureInverse( srcBuff , &newSrc , destBuff , &newDest );
  649.     }
  650.     else if( options & kDrawTint )
  651.     {
  652.         DrawPictureTint( srcBuff , &newSrc , destBuff , &newDest , more , color );
  653.     }
  654.     else
  655.     {
  656.         DrawPicture( srcBuff , &newSrc , destBuff , &newDest );
  657.     }
  658. }
  659. /*----------------------------------------------------------------------------\
  660.  
  661.     DrawClipedPicture
  662.  
  663. - this asumes the src and the clip are the same size and adjustes the src
  664.  
  665. \----------------------------------------------------------------------------*/
  666.  
  667. void    DrawClipedPicture2(     OffScreenBuff *srcBuff, const rect *src ,
  668.                                         OffScreenBuff *destBuff , const rect *dest , 
  669.                                         const rect *destClip)
  670. {
  671.     rect    newSrc, newDest;
  672.     ulong    srcRowSize;
  673.     ulong    destRowSize;
  674.     ushort    *srcPtr , *srcRowStart;
  675.     ushort    *destPtr , *destRowStart;
  676.     short    x;
  677.     short    y;
  678.     
  679.  
  680.     newDest.left = ( dest->left > destClip->left ) ? dest->left : destClip->left;                
  681.     newDest.right = ( dest->right < destClip->right ) ? dest->right : destClip->right;
  682.     newDest.top = ( dest->top > destClip->top ) ? dest->top : destClip->top;
  683.     newDest.bottom = ( dest->bottom < destClip->bottom ) ? dest->bottom : destClip->bottom;
  684.     
  685.     newSrc = *src;
  686.  
  687.         
  688.     newSrc.left +=  ( destClip->left < dest->left ) ? dest->left - destClip->left : 0; 
  689.     newSrc.right -= ( destClip->right  > dest->right ) ? destClip->right - dest->right : 0;
  690.     newSrc.top += ( destClip->top < dest->top ) ? dest->top - destClip->top : 0;
  691.     newSrc.bottom -= ( destClip->bottom > dest->bottom ) ? destClip->bottom - dest->bottom : 0;
  692.  
  693.  
  694. //        CopyBits( (BitMap *) (*(srcBuff->GetOffScreen()->PixMap)), (BitMap *) (*(destBuff->GetOffScreen()->PixMap)),
  695. //        & rToR( newSrc ), & rToR( newDest ), srcCopy , (RgnHandle)nil );
  696.  
  697.     
  698.     srcRowSize = srcBuff->GetRowSize();
  699.     destRowSize = destBuff->GetRowSize();
  700.              
  701.     (char *)srcRowStart = (char *)srcBuff->GetSrcPtr() + newSrc.top * srcRowSize + newSrc.left * sizeof( ushort );
  702.     (char *)destRowStart = (char *)destBuff->GetSrcPtr() + newDest.top * destRowSize + newDest.left * sizeof( ushort );
  703.     
  704.     for( y = newDest.top; y < newDest.bottom; y++ )
  705.     {
  706.         srcPtr = srcRowStart;
  707.         destPtr = destRowStart;
  708.         
  709.         for( x = newDest.left; x < newDest.right; x++ )
  710.         {
  711.             *destPtr = *srcPtr;
  712.             
  713.             destPtr++;
  714.             srcPtr++;
  715.         }
  716.         
  717.         (char *)srcRowStart += srcRowSize;
  718.         (char *)destRowStart += destRowSize;
  719.       }
  720.       
  721. }
  722.